const express = require('express') //导入express模块
//导入body-parser模块
const bodyParser = require('body-parser')
//导入cors模块
const cors = require('cors')
//导入fs模块
const fs = require('fs')
//导入path模块
const path = require('path')

//实例化Express模块
const app = express()

//处理跨域
app.use(cors())

//参数处理
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

//设置登录请求路由
app.post('/login', (req, res) => {
  //通过req对象 获取前端传递过来的登录参数
  const { username, password } = req.body
  //读取user.json文件
  fs.readFile(path.join(__dirname, '../public/data/user.json'), 'utf-8', (err, data) => {
    //err是错误参数
    if (err) return res.json({ status: 404, message: '数据读取失败' })
    //如果没有return出去 将文件转换为对象
    data = JSON.parse(data)
    //遍历读取到的data数据
    for (let i = 0; i < data.length; i++) {
      //判断用户输入的内容是否与用户输入的一致
      if (data[i].username == username && data[i].password == password) {
        return res.json({ status: 200, message: '登录成功', email: data[i].email })
      }
    }
    return res.json({ status: 404, message: '登录失败' })
  })
})

//设置注册请求路由
app.post('/register', (req, res) => {
  //获取前端传递过来的注册参数
  const { email, username, password } = req.body
  //读取user.json文件
  fs.readFile(path.join(__dirname, '../public/data/user.json'), 'utf-8', (err, data) => {
    if (err) return res.json({ status: 403, message: '数据读取失败' })
    //将读取到的data转换为对象
    data = JSON.parse(data)
    //遍历data数据
    for (let i = 0; i < data.length; i++) {
      //判断用户名是否已存在
      if (data[i].username == username) {
        return res.json({ status: 404, message: '用户名已存在' })
      }
    }
    //如果不存在 则将新用户添加到data中
    data.push({ email, username, password })
    //将更新后的data写入user.json文件中
    fs.writeFile(path.join(__dirname, '../public/data/user.json'), JSON.stringify(data), (err) => {
      if (err) return res.json({ status: 403, message: '数据写入失败' })
      res.json({ status: 200, message: '注册成功' })
    })
  })
})

//list路由
app.get('/list', (req, res) => {
  //文件读取操作
  fs.readFile(path.join(__dirname, '../public/data/list.json'), 'utf-8', (err, data) => {
    if (err) return res.json({ status: 403, message: '数据读取失败' })
    data = JSON.parse(data)
    res.json({ status: 200, message: '数据读取成功' }, data)
  })
})

// 修改用户信息接口
app.post('/updateUser', (req, res) => {
  const { username, newInfo } = req.body // newInfo 是要修改的内容对象
  fs.readFile(path.join(__dirname, '../public/data/user.json'), 'utf-8', (err, data) => {
    if (err) return res.json({ status: 500, message: '数据读取失败' })
    let users = JSON.parse(data)
    let user = users.find((u) => u.username === username)
    if (!user) {
      return res.json({ status: 404, message: '用户不存在' })
    }
    // 更新用户信息
    Object.assign(user, newInfo)
    fs.writeFile(path.join(__dirname, '../public/data/user.json'), JSON.stringify(users), (err) => {
      if (err) return res.json({ status: 500, message: '数据写入失败' })
      res.json({ status: 200, message: '用户信息修改成功', user })
    })
  })
})

// 添加订单接口（每个商品单独成订单）
app.post('/addOrder', (req, res) => {
  const { username, goods } = req.body
  if (!username || !goods) {
    return res.json({ status: 400, message: '参数不完整' })
  }

  const orderPath = path.join(__dirname, '../public/data/orderlist.json')
  fs.readFile(orderPath, 'utf-8', (err, data) => {
    let orderList = []
    if (!err && data) {
      try {
        orderList = JSON.parse(data)
      } catch (e) {
        orderList = []
      }
    }
    // 每个商品单独生成一个订单对象
    const newOrders = goods.map((item) => ({
      username,
      goods: item,
      time: Date.now(),
      // 订单状态
      status: '待发货'
    }))
    orderList.push(...newOrders)
    fs.writeFile(orderPath, JSON.stringify(orderList, null, 2), (err) => {
      if (err) return res.json({ status: 500, message: '订单写入失败' })
      res.json({ status: 200, message: '下单成功', orders: newOrders })
    })
  })
})

// 添加商品到购物车接口
app.post('/addCartItem', (req, res) => {
  const { username, goods } = req.body;
  if (!username || !goods) {
    return res.json({ status: 400, message: '参数不完整' });
  }
  const cartPath = path.join(__dirname, '../public/data/cart.json');
  fs.readFile(cartPath, 'utf-8', (err, data) => {
    let cartList = [];
    if (!err && data) {
      try {
        cartList = JSON.parse(data);
      } catch (e) {
        cartList = [];
      }
    }
    // 查找用户购物车
    let userCart = cartList.find(item => item.username === username);
    if (!userCart) {
      // 新用户购物车
      userCart = { username, goods: [] };
      cartList.push(userCart);
    }
    // 检查是否已存在该商品（按id判断）
    const exist = userCart.goods.find(g => g.id === goods.id);
    if (exist) {
      // 已存在则数量累加
      exist.ordernum = String(Number(exist.ordernum || 1) + Number(goods.ordernum || 1));
    } else {
      userCart.goods.push(goods);
    }
    fs.writeFile(cartPath, JSON.stringify(cartList, null, 2), err => {
      if (err) return res.json({ status: 500, message: '购物车写入失败' });
      res.json({ status: 200, message: '加入购物车成功', goods: userCart.goods });
    });
  });
});

// 删除购物车商品接口
app.post('/deleteCartItem', (req, res) => {
  const { username, id } = req.body;
  if (!username || !id) {
    return res.json({ status: 400, message: '参数不完整' });
  }
  const cartPath = path.join(__dirname, '../public/data/cart.json');
  fs.readFile(cartPath, 'utf-8', (err, data) => {
    if (err) return res.json({ status: 500, message: '购物车读取失败' });
    let cartList = [];
    try {
      cartList = JSON.parse(data);
    } catch (e) {
      return res.json({ status: 500, message: '购物车数据异常' });
    }
    // 找到该用户的购物车
    const userCart = cartList.find(item => item.username === username);
    if (!userCart || !Array.isArray(userCart.goods)) {
      return res.json({ status: 404, message: '未找到该用户购物车' });
    }
    // 删除指定商品
    const beforeLen = userCart.goods.length;
    userCart.goods = userCart.goods.filter(g => g.id !== id);
    if (userCart.goods.length === beforeLen) {
      return res.json({ status: 404, message: '购物车中无此商品' });
    }
    // 写回文件
    fs.writeFile(cartPath, JSON.stringify(cartList, null, 2), err => {
      if (err) return res.json({ status: 500, message: '购物车写入失败' });
      res.json({ status: 200, message: '删除成功', goods: userCart.goods });
    });
  });
});


// 读取商品列表
app.get('/goodsList', (req, res) => {
  //文件读取操作
  fs.readFile(path.join(__dirname, '../public/data/goods.json'), 'utf-8', (err, data) => {
    if (err) return res.json({ status: 403, message: '数据读取失败' })
    data = JSON.parse(data)
    res.json({ status: 200, message: '数据读取成功', data })
  })
})

// 删除指定商品
app.post('/delGoods', (req, res) => {
  // 获取商品id
  const { id } = req.body
  if (!id) {
    return res.json({ status: 400, message: '参数不完整' })
  }
  const goodsPath = path.join(__dirname, '../public/data/goods.json')
  fs.readFile(goodsPath, 'utf-8', (err, data) => {
    if (err) return res.json({ status: 500, message: '数据读取失败' })
    let goodsList = []
    try {
      goodsList = JSON.parse(data)
    } catch (e) {
      return res.json({ status: 500, message: '数据解析失败' })
    }
    // 删除指定商品
    goodsList = goodsList.filter(item => item.id !== id)
    fs.writeFile(goodsPath, JSON.stringify(goodsList, null, 2), (err) => {
      if (err) return res.json({ status: 500, message: '删除时出现错误' })
      res.json({ status: 200, message: '删除成功' })
    })
  })
})

// 修改商品
app.post('/modifyGoods', (req, res) => {
  const { newitem } = req.body
  if (!newitem) {
    return res.json({ status: 400, message: '参数不完整' })
  }
  const goodsPath = path.join(__dirname, '../public/data/goods.json')
  fs.readFile(goodsPath, 'utf-8', (err, data) => {
    if (err) return res.json({ status: 500, message: '数据读取失败' })
    let goodsList = []
    try {
      goodsList = JSON.parse(data)
    } catch (e) {
      return res.json({ status: 500, message: '数据解析失败' })
    }
    // 修改指定商品
    goodsList = goodsList.map(item =>{
      if(item.id === newitem.id ){
        return newitem
      }else{
        return item
      }
    })
    fs.writeFile(goodsPath, JSON.stringify(goodsList, null, 2), (err) => {
      if (err) return res.json({ status: 500, message: '修改时出现错误' })
      res.json({ status: 200, message: '修改成功' })
    })
  })
})


//监听服务端开启
app.listen(3000, () => console.log('3000端口 服务已启动...'))
